package v1

import (
	. "gintify/core"
	"gintify/model"
	"gintify/response"
	"github.com/gin-gonic/gin"
	"strconv"
)

type IRoleController interface {
	IRestController
}

type RoleController struct {
	// 空结构体
}

func NewRoleController() *RoleController {
	DB.Debug().AutoMigrate(&model.SysRole{})
	return &RoleController{}
}
// @Summary 新增角色
// @Description 在数据库中新增角色
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles [post]
func (r RoleController) Post(c *gin.Context) {
	var role = model.SysRole{}
	if err := c.ShouldBindJSON(&role); err != nil {
		response.Error(c, "绑定错误", err)
		return
	}
	if role.Name == "" {
		response.Error(c, "绑定错误", nil)
		return
	}
	if isRoleExist(role.Name) {
		response.Fail(c, "角色名已被占用", nil)
		return
	}
	if err:=DB.Debug().Create(&role).Error;err !=nil{
		response.Error(c, "创建失败", err)
		return
	}
	response.Success(c, "新建角色成功", role)
}
// @Summary 获取角色列表
// @Description 在数据库中获取角色列表信息
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Success 200 {object} []model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles [get]
func (r RoleController) GetList(c *gin.Context) {
	var roles []model.SysRole
	if err:=DB.Debug().Preload("Users").Preload("Menus").Find(&roles).Error;err!=nil{
		response.Error(c, "查询失败", err)
		return
	}
	if len(roles) == 0 {
		response.Success(c, "角色列表为空", nil)
		return
	}
	response.Success(c, "获取角色列表成功", roles)
}
// @Summary 获取角色
// @Description 在数据库中获取角色信息
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "role id in database"
// @Success 200 {object} model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles/{id} [get]
func (r RoleController) Get(c *gin.Context) {
	var role model.SysRole
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}

	if err:=DB.Debug().Preload("Users").Preload("Menus").First(&role, idx).Error;err!=nil{
		response.Error(c, "查询失败", nil)
		return
	}
	if role.ID == 0 {
		response.Fail(c, "角色不存在", nil)
		return
	}
	//var menus = []model.SysMenu{}
	//if err:=DB.Model(&role).Related(&menus, "Menus").Error;err!=nil{
	//	response.Error(c, "查询失败", nil)
	//	return
	//}
	//role.Menus = menus
	//fmt.Printf("%v\n", menus)
	//if err := DB.Model(&role).Association("Menus").Find(&role.Menus).Error; err != nil{
	//	fmt.Println("关联失败")
	//}
	response.Success(c, "获取角色信息成功", role)
}
// @Summary 更新角色
// @Description 在数据库中更新角色信息
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "role id in database"
// @Success 200 {object} model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles/{id} [put]
func (r RoleController) Put(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	var role = model.SysRole{}
	if err := c.ShouldBindJSON(&role); err != nil {
		response.Error(c, "绑定错误", err)
		return
	}
	if err:=DB.Model(&model.SysRole{}).Where("id = ?", idx).Updates(&role).Error;err !=nil{
		response.Error(c, "更新失败", err)
		return
	}
	response.Updated(c, "更新成功", nil)
}
// @Summary 更新角色
// @Description 在数据库中更新角色信息
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "role id in database"
// @Success 200 {object} model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles/{id} [patch]
func (r RoleController) Patch(c *gin.Context) {
	panic("implement me")
}
// @Summary 删除角色
// @Description 在数据库中软删除角色
// @Tags 角色
// @Accept  json
// @Produce  json
// @Security ApiKeyAuth
// @Param id path uint64 true "role id in database"
// @Success 200 {object} model.SysRole "{"code":0,"msg":"OK","data": {}}"
// @Router /api/v1/roles/{id} [delete]
func (r RoleController) Delete(c *gin.Context) {
	ids := c.Param("id")
	idx, err := strconv.Atoi(ids)
	if err != nil || idx < 1 {
		response.Fail(c, "URL路径有错误", err)
		return
	}
	if err := DB.Debug().Delete(&model.SysRole{}, idx).Error; err != nil {
		response.Error(c, "删除失败", err)
		return
	}
	response.Deleted(c, "删除成功", nil)
}

func isRoleExist(name string) bool {
	var role model.SysRole
	if err:=DB.Where("name = ?", name).First(&role).Error;err!=nil{
		//response.Error(c, "绑定错误", nil)
		return false
	}
	return role.ID != 0
}
